#pragma once

#include <iostream>
#include <string>
#include <sstream>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#include "Util.hpp"

using namespace std;

const string sep = "\r\n";

const string default_path = "./wwwroot";

const string home_page = "./wwwroot/index.html"; // 默认首页

const string html_404 = "./wwwroot/404.html"; // 404页面

class HttpRequest
{
public:
    HttpRequest()
    {
    }
    ~HttpRequest()
    {
    }

    void parse()
    {
        // 读取第一行
        string line = Util::getOneLine(inbuffer, sep);
        if (line.empty())
            return;

        cout << "line: " << line << endl;

        // 分割第一行
        stringstream ss(line);
        ss >> method >> url >> httpversion;

        // 如果网页提交了数据
        // 就需要对url进行分割  /a/b/test.java?name=chb&pwd=123456
        // 左边：path 右边：parameter
        // 如果是POST方法，那么不用分离，因为POST方法是通过正文提交参数的！
        // 而GET是通过url拼接的，如上。正因如此，私密性不会，也注定了参数不能过大，例如图片等二进制文件
        // POST方法的话参数可以很大，私密性好一点
        // 但是！私密性 != 安全性，要想安全，必须加密，POST和GET方法都是不安全的!

        // 设置默认路径
        path = default_path;
        path += url; // ---> ./wwwroot/a/b/c  or ./wwwroot/

        if (path[path.size() - 1] == '/')
            path = home_page;

        // 设置后缀属性，方便响应报文正确填写请求头部的Content-Type字段
        // ./wwwroot/image/1.jpg
        // ./wwwroot/index.html
        auto pos = path.rfind(".");
        if (pos == string::npos)
            suffix = ".html";
        else
            suffix = path.substr(pos);

        // 获取资源文件的大小
        struct stat st;
        int n = stat(path.c_str(), &st);
        if(n == 0) size = st.st_size;
        else size = -1;
    }

public:
    string inbuffer;

    string method;
    string url;
    string path;
    string httpversion;
    string suffix;
    int size;
};

class HttpResponse
{
public:
    string outbuffer;
};